import axios from 'axios';

const CountryMaps = [
  '阿富汗.json',
  '阿尔巴尼亚.json',
  '阿尔及利亚.json',
  '美属萨摩亚.json',
  '安道尔.json',
  '安哥拉.json',
  '安提瓜和巴布达.json',
  '阿根廷.json',
  '亚美尼亚.json',
  '澳大利亚.json',
  '奥地利.json',
  '阿塞拜疆.json',
  '巴林.json',
  '孟加拉国.json',
  '巴巴多斯.json',
  '白俄罗斯.json',
  '比利时.json',
  '伯利兹.json',
  '贝宁.json',
  '不丹.json',
  '玻利维亚.json',
  '波斯尼亚和黑塞哥维那.json',
  '博茨瓦纳.json',
  '巴西.json',
  '文莱.json',
  '保加利亚.json',
  '布基纳法索.json',
  '布隆迪.json',
  '柬埔寨.json',
  '喀麦隆.json',
  '加拿大.json',
  '佛得角.json',
  '中非共和国.json',
  '乍得.json',
  '智利.json',
  '中国.json',
  '哥伦比亚.json',
  '科摩罗.json',
  '库克群岛.json',
  '哥斯达黎加.json',
  '克罗地亚.json',
  '古巴.json',
  '塞浦路斯.json',
  '捷克共和国.json',
  '刚果民主共和国.json',
  '丹麦.json',
  '吉布提.json',
  '多米尼加.json',
  '多米尼加共和国.json',
  '东帝汶.json',
  '厄瓜多尔.json',
  '埃及.json',
  '萨尔瓦多.json',
  '赤道几内亚.json',
  '厄立特里亚.json',
  '爱沙尼亚.json',
  '埃塞俄比亚.json',
  '法罗群岛.json',
  '斐济.json',
  '芬兰.json',
  '法国.json',
  '法国南部和南极地区.json',
  '加蓬.json',
  '冈比亚.json',
  '格鲁吉亚.json',
  '德国.json',
  '加纳.json',
  '希腊.json',
  '格陵兰.json',
  '格林纳达.json',
  '关岛.json',
  '危地马拉.json',
  '几内亚比绍.json',
  '几内亚.json',
  '圭亚那.json',
  '海地.json',
  '洪都拉斯.json',
  '匈牙利.json',
  '冰岛.json',
  '印度.json',
  '印度尼西亚.json',
  '伊朗.json',
  '伊拉克.json',
  '爱尔兰.json',
  '以色列.json',
  '意大利.json',
  '象牙海岸.json',
  '牙买加.json',
  '日本.json',
  '约旦.json',
  '哈萨克斯坦.json',
  '肯尼亚.json',
  '科索沃.json',
  '科威特.json',
  '吉尔吉斯斯坦.json',
  '老挝.json',
  '拉脱维亚.json',
  '黎巴嫩.json',
  '莱索托.json',
  '利比里亚.json',
  '利比亚.json',
  '列支敦士登.json',
  '立陶宛.json',
  '卢森堡.json',
  '马其顿.json',
  '马达加斯加.json',
  '马拉维.json',
  '马来西亚.json',
  '马里.json',
  '马耳他.json',
  '毛里塔尼亚.json',
  '毛里求斯.json',
  '墨西哥.json',
  '摩尔多瓦.json',
  '摩纳哥.json',
  '蒙古.json',
  '黑山.json',
  '摩洛哥.json',
  '莫桑比克.json',
  '缅甸.json',
  '纳米比亚.json',
  '瑙鲁.json',
  '尼泊尔.json',
  '新喀里多尼亚.json',
  '新西兰.json',
  '尼加拉瓜.json',
  '尼日尔.json',
  '尼日利亚.json',
  '朝鲜.json',
  '北马里亚纳群岛.json',
  '挪威.json',
  '阿曼.json',
  '巴基斯坦.json',
  '帕劳.json',
  '巴拿马.json',
  '巴布亚新几内亚.json',
  '巴拉圭.json',
  '秘鲁.json',
  '菲律宾.json',
  '波兰.json',
  '葡萄牙.json',
  '波多黎各.json',
  '卡塔尔.json',
  '塞尔维亚共和国.json',
  '刚果共和国.json',
  '罗马尼亚.json',
  '俄罗斯.json',
  '卢旺达.json',
  '圣基茨和尼维斯.json',
  '圣卢西亚.json',
  '圣文森特和格林纳丁斯.json',
  '萨摩亚.json',
  '圣马力诺.json',
  '圣多美和普林西比.json',
  '沙特阿拉伯.json',
  '塞内加尔.json',
  '塞舌尔.json',
  '塞拉利昂.json',
  '新加坡.json',
  '斯洛伐克.json',
  '斯洛文尼亚.json',
  '所罗门群岛.json',
  '索马里.json',
  '索马里兰.json',
  '南非.json',
  '韩国.json',
  '南苏丹.json',
  '西班牙.json',
  '斯里兰卡.json',
  '苏丹.json',
  '苏里南.json',
  '斯威士兰.json',
  '瑞典.json',
  '瑞士.json',
  '叙利亚.json',
  '台湾.json',
  '塔吉克斯坦.json',
  '泰国.json',
  '巴哈马群岛.json',
  '荷兰.json',
  '多哥.json',
  '特立尼达和多巴哥.json',
  '突尼斯.json',
  '土耳其.json',
  '土库曼斯坦.json',
  '乌干达.json',
  '乌克兰.json',
  '阿拉伯联合酋长国.json',
  '英国.json',
  '坦桑尼亚联合共和国.json',
  '美属维尔京群岛.json',
  '美利坚合众国.json',
  '乌拉圭.json',
  '乌兹别克斯坦.json',
  '瓦努阿图.json',
  '委内瑞拉.json',
  '越南.json',
  '瓦利斯和富图纳.json',
  '西撒哈拉.json',
  '也门.json',
  '赞比亚.json',
  '津巴布韦.json'
];

class MapLoader {
  constructor() {
    this._mapCache = {};
    this._maxRequest = 5;
    this._currentRequests = {};
    this._waitingRequestUrls = [];
  }
  _fixType = ele => {
    if (!ele.type) {
      ele.type = 'Feature';
    }
  };
  loadMap = url => {
    if (this._mapCache[url]) {
      return Promise.resolve(this._mapCache[url]);
    } else if (this._currentRequests[url]) {
      return this._currentRequests[url];
    } else {
      this._currentRequests[url] = axios
        .get(url)
        .then(res => {
          const data = res.data;
          if (data && typeof data === 'object') {
            if (Array.isArray(data)) {
              data.forEach(this._fixType);
            } else {
              this._fixType(data);
              if (Array.isArray(data.features)) {
                data.features.forEach(this._fixType);
              }
            }
            this._mapCache[url] = data;

            return data;
          } else {
            return null;
          }
        })
        .catch(() => {
          // no deal
        })
        .finally(() => {
          delete this._currentRequests[url];
        });
      return this._currentRequests[url];
    }
  };

  _fireNext = () => {
    if (
      this._waitingRequestUrls.length &&
      Object.keys(this._currentRequests).length < this._maxRequest
    ) {
      const requestUrl = this._waitingRequestUrls;
      this.loadMap(requestUrl);
    }
  };

  loadAllMaps = () => {
    for (let map of CountryMaps) {
      this.loadMap(`/maps/${map}`);
    }
  };
}

export default new MapLoader();
